/* -*- tab-width: 4 -*-
 *
 * Electric(tm) VLSI Design System
 *
 * File: MinAreaCheckerImplementation.java
 * Written by: Daniel Schmidt
 * 
 * This code has been developed at the Karlsruhe Institute of Technology (KIT), Germany, 
 * as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
 * Contact instructor: Dr. Victor Pankratius (pankratius@ipd.uka.de)
 *
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
 *
 * Electric(tm) is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * Electric(tm) is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Electric(tm); see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, Mass 02111-1307, USA.
 */
package com.sun.electric.plugins.minarea.mk01;

import com.sun.electric.api.minarea.MinAreaChecker;
import com.sun.electric.api.minarea.ErrorLogger;
import com.sun.electric.api.minarea.LayoutCell;

import java.util.Properties;


public class MinAreaCheckerImplementation implements MinAreaChecker {

	public static int numOfThreads;
	public static boolean DEBUG = false;
	
	public MinAreaCheckerImplementation() {}
	
    /**
     * 
     * @return the algorithm name
     */
    @Override
    public String getAlgorithmName() {
        return "mk01";
    }

    /**
     * 
     * @return the names and default values of algorithm parameters
     */
    @Override
    public Properties getDefaultParameters() {
        Properties result = new Properties();

        result.put(REPORT_TILES, Boolean.TRUE);
        result.put(NUM_THREADS, 4);
        return result;
    }

    /**
     * @param topCell top cell of the layout
     * @param minArea minimal area of valid polygon
     * @param parameters algorithm parameters
     * @param errorLogger an API to report violations
     */
    @Override
    public void check(LayoutCell topCell, long minArea, Properties parameters, ErrorLogger errorLogger) {
        boolean reportTiles = Boolean.parseBoolean(parameters.get(MinAreaChecker.REPORT_TILES).toString());
        numOfThreads = Integer.parseInt(parameters.get(MinAreaChecker.NUM_THREADS).toString());
        numOfThreads = numOfThreads <= 128 ? numOfThreads : 128;
        // Class MinAreaCheckerImplementation should be re-entrant.
        // So create a new object for each task
        new MinAreaCheckerTask(topCell, minArea, reportTiles, errorLogger);
    }
}
